package com.um2.compression.grol;

import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class LireFichierBinaire {
	
	 public static String ouvrirBinaireGrol(File fichierBinaireAOuvrir,FenetreApplication fen) throws IOException {
		 
	    DataInputStream lecture;    
	   
	    lecture= new DataInputStream(new BufferedInputStream(new FileInputStream(fichierBinaireAOuvrir)));
	    
	    
	    //Extension 
	    
	    //System.out.print("Extension : ");
	    
	    
	    String verificationExtentionFichier = "" ;
	    for ( int i=0 ; i<5 ; i++ )
	    {
	    	verificationExtentionFichier += lecture.readChar() ;
	    }
	    
	    if (!verificationExtentionFichier.equals(".grol")) 
	    {
	    	System.err.println("fichier avec une entete non '.grol'");
	    	return "" ;
	    }
	    
	    
	    //System.out.println();
	    //System.out.println();
	    
	    //Hauteur img
	    int hauteurImage = lecture.readShort() ;
	    //System.out.println("Hauteur img : "+hauteurImage+"px");
	    //System.out.println();
	    
	    
	    int largeurImage = lecture.readShort() ;
	    //Largeur img
	    //lecture.readShort();
	    //System.out.println("Largeur img : "+largeurImage+"px");
	    //System.out.println();
	    
		BufferedImage bufferLuminance = new BufferedImage(largeurImage,
				hauteurImage,
				 BufferedImage.TYPE_INT_ARGB);
	    
		BufferedImage bufferCr = new BufferedImage(largeurImage,
				hauteurImage,
				 BufferedImage.TYPE_INT_ARGB);
	    
		BufferedImage bufferCb = new BufferedImage(largeurImage,
				hauteurImage,
				 BufferedImage.TYPE_INT_ARGB);
	    
		boolean[][] tableauDesExplores= new boolean[largeurImage][hauteurImage] ;

		
		
		for (int i = 0; i < bufferLuminance.getWidth(); i++) {
			for (int j = 0; j < bufferLuminance.getHeight(); j++) {
				bufferLuminance.setRGB(i, j, 0x00000000) ;
				bufferCr.setRGB(i, j, 0x00000000) ;
				bufferCb.setRGB(i, j, 0x00000000) ;
				tableauDesExplores[i][j] = false ;
			}
		}
		
		
	    fen.getPanneauCentre().getPanneauImageOuverteL().setImage(bufferLuminance) ;
	    fen.getPanneauCentre().getPanneauImageOuverteCr().setImage(bufferCr) ;
	    fen.getPanneauCentre().getPanneauImageOuverteCb().setImage(bufferCb) ;
	    fen.getPanneauCentre().getPanneauImageOuverte().recalculeImage() ;
	    
	  
	    //System.out.println();
	    
	    
	    
	    
	    
	    /** LUMINANCE */
	    
	    //Nombre de rectangle pour la Luminance
	    //System.out.println();
	    //System.out.println();
	    //System.out.println("------ LUMINANCE (Y) ------");
	    //System.out.println();
	    
	    int nb_rect_Y = lecture.readShort();
	    System.out.println("il y a NB de rectangles Y "+nb_rect_Y);
	    
	    //System.out.println("Nb rect pour Y : "+nb_rect_Y);
	    //System.out.println();
	    //System.out.println("Rectangles pour Y : ");
	    //System.out.println();
	    
	    for ( int i=0 ; i<nb_rect_Y ; i++ ) {
	        
	    	int valeur = lecture.readShort() ;
	    	//System.out.println("Val Y ["+i+"] : "+valeur);
	    	//System.out.print("Rect Y ["+i+"] : ");
	    	int x = lecture.readShort() ;
	    	//System.out.print("X="+x+"  ");
	    	int y = lecture.readShort() ;
	    	//System.out.print("Y="+y+"  ");
	    	int largeur = lecture.readShort() ;
	    	//System.out.print("larg="+largeur+"  ");
	    	int hauteur = lecture.readShort() ;
	    	//System.out.print("haut="+hauteur);
	    	//System.out.println();
	    	//System.out.println();
	    	
	    	
	    	// ecrire dans le buffer de la luminance.
	    	for (int j = x; j < x+largeur; j++) {
				for (int k = y; k < y+hauteur; k++) {
					bufferLuminance.setRGB(j, k, (new Color(valeur,valeur,valeur).getRGB())) ;
//					bufferLuminance.setRGB(j, k, (new Color(255,0,0).getRGB())) ;
					tableauDesExplores[j][k] = true ;
				}
			}
	    	
	    	
	    }
	    
	    
	    
    	//Px restant pour la Luminance (Y)
    	/****************************************/
    	/****************************************/
	    int nb_px_Y = lecture.readShort();
	    
	    System.out.println("il reste en buffer de Y (pixels) "+nb_px_Y);
	    
	    
	    // les pixels non enregistres :
	    int cmpt = 0 ;
		for (int i = 0; i < bufferLuminance.getHeight(); i++) {
			for (int j = 0; j < bufferLuminance.getWidth(); j++) {
				if (cmpt<nb_px_Y && (tableauDesExplores[j][i]==false)) {
					int val = lecture.readShort() ;
//					bufferLuminance.setRGB(j, i, (new Color(255,0,0).getRGB())) ;
					bufferLuminance.setRGB(j, i, (new Color(val,val,val).getRGB())) ;
					cmpt++ ;
				}
			}
		}
		
		while (cmpt < nb_px_Y)
		{
			@SuppressWarnings("unused")
			int val = lecture.readShort() ;
			cmpt++ ;
		}
    	/****************************************/
    	/****************************************/

		
		
		
		
    	/******************************************/
	    /** CRomi - Rouge */
	    
		
		for (int i = 0; i < bufferLuminance.getWidth(); i++) {
			for (int j = 0; j < bufferLuminance.getHeight(); j++) {
				tableauDesExplores[i][j] = false ;
			}
		}

	    //Nombre de rectangle pour la Luminance
	    //System.out.println();
	    //System.out.println();
	    //System.out.println("------ Cromi Rouge (Cr) ------");
	    //System.out.println();
	    
	    int nb_rect_Cr = lecture.readShort();
	    System.out.println("il y a NB de rectangles Cr "+nb_rect_Cr);
	    
	    //System.out.println("Nb rect pour Cr : "+nb_rect_Cr);
	    //System.out.println();
	    //System.out.println("Rectangles pour Cr : ");
	    //System.out.println();
	    
	    for ( int i=0 ; i<nb_rect_Cr ; i++ ) {
	        
	    	int valeur = lecture.readShort() ;
	    	//System.out.println("Val Y ["+i+"] : "+valeur);
	    	//System.out.print("Rect Y ["+i+"] : ");
	    	int x = lecture.readShort() ;
	    	//System.out.print("X="+x+"  ");
	    	int y = lecture.readShort() ;
	    	//System.out.print("Y="+y+"  ");
	    	int largeur = lecture.readShort() ;
	    	//System.out.print("larg="+largeur+"  ");
	    	int hauteur = lecture.readShort() ;
	    	//System.out.print("haut="+hauteur);
	    	//System.out.println();
	    	//System.out.println();
	    	
	    	
	    	// ecrire dans le buffer de la Cr.
	    	for (int j = x; j < x+largeur; j++) {
				for (int k = y; k < y+hauteur; k++) {
					if (j<=largeurImage && k<=hauteurImage)
					{
						bufferCr.setRGB(j, k, (new Color(valeur,valeur,valeur).getRGB())) ;
//						bufferCr.setRGB(j, k, (new Color(255,0,0).getRGB())) ;
						tableauDesExplores[j][k] = true ;						
					}
				}
			}
	    }
	 
	    
	    
	   	/****************************************/
    	/****************************************/
    	//Px restant pour la Luminance (Cr)
	    int nb_px_Cr = lecture.readShort();

	    System.out.println("il reste en buffer de Cr (pixels) "+nb_px_Cr);
	    
	    // les pixels non enregistres :
	    cmpt = 0 ;
		for (int i = 0; i < bufferLuminance.getHeight(); i++) {
			for (int j = 0; j < bufferLuminance.getWidth(); j++) {
				if (cmpt<nb_px_Cr && (tableauDesExplores[j][i]==false)) {
					int val = lecture.readShort() ;
//					bufferCr.setRGB(j, i, (new Color(255,0,0).getRGB())) ;
					bufferCr.setRGB(j, i, (new Color(val,val,val).getRGB())) ;
					cmpt++ ;
				}
			}
		}

		while (cmpt < nb_px_Cr)
		{
			@SuppressWarnings("unused")
			int val = lecture.readShort() ;
			cmpt++ ;
		}
	   	/****************************************/
    	/****************************************/
		
		
		
	    
	    /** Crominance Bleu */
	    
		for (int i = 0; i < bufferLuminance.getWidth(); i++) {
			for (int j = 0; j < bufferLuminance.getHeight(); j++) {
				tableauDesExplores[i][j] = false ;
			}
		}
	    //Nombre de rectangle pour la Luminance
	    //System.out.println();
	    //System.out.println();
	    //System.out.println("------ LUMINANCE (Cb) ------");
	    //System.out.println();
	    
	    int nb_rect_Cb = lecture.readShort();
	    System.out.println("il y a NB de rectangles Cb "+nb_rect_Cb);
	    
	    //System.out.println("Nb rect pour Y : "+nb_rect_Cb);
	    //System.out.println();
	    //System.out.println("Rectangles pour Y : ");
	    //System.out.println();
	    
	    
	    
	    
	    for ( int i=0 ; i<nb_rect_Cb ; i++ ) {
	        
	    	int valeur = lecture.readShort() ;
	    	//System.out.println("Val Y ["+i+"] : "+valeur);
	    	//System.out.print("Rect Y ["+i+"] : ");
	    	int x = lecture.readShort() ;
	    	//System.out.print("X="+x+"  ");
	    	int y = lecture.readShort() ;
	    	//System.out.print("Y="+y+"  ");
	    	int largeur = lecture.readShort() ;
	    	//System.out.print("larg="+largeur+"  ");
	    	int hauteur = lecture.readShort() ;
	    	//System.out.print("haut="+hauteur);
	    	//System.out.println();
	    	//System.out.println();
	    	
	    	// ecrire dans le buffer de la Cb.
	    	for (int j = x; j < x+largeur; j++) {
				for (int k = y; k < y+hauteur; k++) {
					if (j<largeurImage && k<hauteurImage)
					{
						bufferCb.setRGB(j, k, (new Color(valeur,valeur,valeur).getRGB())) ;
//						bufferCb.setRGB(j, k, (new Color(255,0,0).getRGB())) ;
						tableauDesExplores[j][k] = true ;
					}
				}
			}
	    }

	    
	    
	   	/****************************************/
    	/****************************************/
	   	//Px restant pour la Luminance (Cb)
	    int nb_px_Cb = lecture.readShort();
	    System.out.println("il reste en buffer de Cb (pixels) "+nb_px_Cb);

	    // les pixels non enregistres :
	    cmpt = 0 ;
		for (int i = 0; i < bufferLuminance.getHeight(); i++) {
			for (int j = 0; j < bufferLuminance.getWidth(); j++) {
				if (cmpt<nb_px_Cb && (tableauDesExplores[j][i]==false)) {
					int val = lecture.readShort() ;
					bufferCb.setRGB(j, i, (new Color(val,val,val).getRGB())) ;
//					bufferCb.setRGB(j, i, (new Color(255,0,0).getRGB())) ;
					cmpt++ ;
				}
			}
		}
	    
		while (cmpt < nb_px_Cb)
		{
			@SuppressWarnings("unused")
			int val = lecture.readShort() ;
			cmpt++ ;
		}
	   	/****************************************/
    	/****************************************/
    

	    
	    
	    
	    lecture.close();
	    return fichierBinaireAOuvrir.getName() ;
	    
	  }
}
